package com.beantools.file;

import com.beantools.util.FastDateFormat;

import java.io.Serializable;

import static com.beantools.constants.FrameConstant.*;
import static com.beantools.constants.SingleChar.*;
import static com.beantools.entity.enums.DateFormatEnum.ISO_DATETIME_FORMAT_NONE;
import static com.beantools.util.StringUtil.isBlank;
import static com.beantools.util.StringUtil.isNotBlank;

/**
 * 这是实现文件接口的抽象类，同时，实现{@code  Serializable}接口
 * 并实现<code>String getRealPath();</code>方法，获取项目的根路径
 *
 * @author baoya
 * @version 1.1.o
 * @see JsonFile
 * @since 1.0
 */

public abstract class AbstractFile implements MyFile, Serializable {

    private static final long serialVersionUID = 6050223110403722419L;


    /**
     * 封装文件的路径。如果该系统是Windows系统，其路径一般是这样的：
     * <code>C:\Users\Administrator\Desktop\1.txt</code>调用者需要将
     * 其转化为这样的路径<code>C:/Users/Administrator/Desktop/1.txt</code>
     * <p>
     * 如果是Linux系统，其路径一般是这样的：<code>/usr/etc</code>
     *
     * @param filePath 文件路径
     * @return 转化后的文件路径
     */
    public String getFilePath(String filePath) {
        if (isBlank(filePath)) {
            throw new IllegalArgumentException("文件路径不能为空");
        }
        if (SYSTEM_OS.contains(SYSTEM_OS_WINDOWS) && SYSTEM_OS.contains(SYSTEM_OS_LINUX)) {
            filePath = filePath.replaceAll(FORWARD_LEAN, INVERSE_LEAN);
        }
        return filePath;
    }

    /**
     * 这是获取文件根路径的方法。因为Windows os和Linux os不同，
     * 需要对这两种操作系统的文件进行分别处理
     * <p>
     * 如果没有传递文件路径，就默认为项目的根路径
     *
     * @param filePath       文件的路径
     * @param isRelativePath 文件是否是绝对路径，true表示相对路径，false表示绝对路径
     * @param fileName       文件的名称
     * @return 返回项目的根路径
     */
    @Override
    public String getRealPath(String filePath, boolean isRelativePath, String fileName) {
        if (isBlank(fileName)) {
            fileName = FastDateFormat.formatByEnum(System.currentTimeMillis(),ISO_DATETIME_FORMAT_NONE) + JSON_FILE_SUFFIX;
        } else {
            if (fileName.contains(EN_POINT) && !fileName.contains(JSON_FILE_SUFFIX)) {
                fileName = fileName.substring(0, fileName.lastIndexOf(EN_POINT)) + JSON_FILE_SUFFIX;
            } else if (!fileName.contains(EN_POINT) && !fileName.contains(JSON_FILE_SUFFIX)) {
                fileName = fileName + JSON_FILE_SUFFIX;
            }
        }
        filePath = isNotBlank(filePath) ?
                (isRelativePath ? ROOT_PATH + INVERSE_LEAN + filePath : filePath)
                : ROOT_PATH;
        return getFilePath(filePath + FORWARD_LEAN + fileName);
    }
}
